package bank;

import java.util.ArrayList;
import java.util.List;

public class _54SpiralOrder {
    public static List<Integer> spiralOrder(int[][] matrix) {
        int rowLen = matrix.length,colLen = matrix[0].length;
        List<Integer> res = new ArrayList<>(rowLen*colLen);
        recurse(matrix,res,0,0,rowLen,colLen);
        return res;
    }

    private static void recurse(int[][] matrix, List<Integer> res, int x, int y, int rowLen, int colLen) {
        if (colLen * rowLen <= 0){
            return;
        }
        //  矩形无非判断条件更多一些
        if (rowLen == 1 && colLen != 1){
            for (int i = x;i < x+colLen;i++){
                res.add(matrix[y][i]);
            }
        }else if (colLen == 1 && rowLen != 1){
            for (int i = y;i < y+rowLen;i++){
                res.add(matrix[i][x+colLen-1]);
            }
        }else if (rowLen == 1 && colLen == 1){
            res.add(matrix[y][x]);
        }else {
            for (int i = x;i < x+colLen-1;i++){
                res.add(matrix[y][i]);
            }
            for (int i = y;i < y+rowLen-1;i++){
                res.add(matrix[i][x+colLen-1]);
            }
            for (int i = x+colLen-1;i > x;i--){
                res.add(matrix[y+rowLen-1][i]);
            }
            for (int i = y+rowLen-1;i > y;i--){
                res.add(matrix[i][x]);
            }
        }
        recurse(matrix,res,x+1,y+1,rowLen-2,colLen-2);
    }
}
